package com.xhs.minio.controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.xhs.minio.core.message.ReturnResult;
import com.xhs.minio.core.utils.MinIoUtil;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotEmpty;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

/**
 * @desc: 文件操作控制器
 * @projectName: spring-boot-minio
 * @author: xhs
 * @date: 2025-08-16 周六 17:45
 */
@Slf4j
@Validated
@RestController
@RequestMapping("/file")
public class FileController {

    @Resource
    private MinIoUtil minIoUtil;

    /**
     * 上传文件到minio(默认的存储桶)
     *
     * @param file 入参
     * @return ReturnResult<Object>
     */
    @GetMapping("/uploadMinioFile")
    public ReturnResult<Object> uploadMinioFile(@RequestPart("file") MultipartFile file) {
        if (file.isEmpty()) {
            return ReturnResult.error("上传文件内容为空");
        }
        // 获取桶名称
        String bucketName = minIoUtil.getDefaultBucketName();
        // 生成id
        String fileId = IdUtil.fastUUID();
        // 获取文件原始名称
        String originalFileName = file.getOriginalFilename();
        // 获取文件后缀
        String fileSuffix = FileUtil.getSuffix(originalFileName);
        // 生成文件的对象名称，格式如:1377109572375810050.docx
        String fileObjectName = fileId + StrUtil.DOT + fileSuffix;
        // 获取日期文件夹，格式如，2025/08/16/
        String dateFolderPath = DateUtil.thisYear() + StrUtil.SLASH +
                (DateUtil.thisMonth() + 1) + StrUtil.SLASH +
                DateUtil.thisDayOfMonth() + StrUtil.SLASH;
        // 文件路径
        String fileKey = dateFolderPath + fileObjectName;
        // 上传文件
        String url = minIoUtil.storageFileWithReturnUrl(bucketName, fileKey, file);
        log.info(" \n 上传文件成功，文件路径为:{}", url);
        return ReturnResult.success().setData(url);
    }

    /**
     * 删除文件
     *
     * @param fileUrl 文件地址
     * @return ReturnResult<Object>
     */
    @GetMapping("/delete")
    public ReturnResult<Object> deleteFile(@NotEmpty(message = "文件地址不能为空") String fileUrl) {
        // 获取桶名称
        String bucketName = minIoUtil.getDefaultBucketName();
        // 判断是否存在文件
        boolean existingFile = minIoUtil.isExistingFile(bucketName, fileUrl);
        if (!existingFile) {
            return ReturnResult.error("文件不存在").setData(fileUrl);
        }
        // 删除文件
        minIoUtil.deleteFile(bucketName, fileUrl);
        return ReturnResult.success("删除文件成功");
    }
}
